﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Apa.Data;
using System.Collections;
using System.Data;

namespace Apa.Control
{
    public class Controladora
    {
        bdConexionDataContext conex;
        public Controladora()
        {
            conex = new bdConexionDataContext();
        }

        public tblUsuario consultarUsuario(string nombreUsuario, string clave)
        {
            try
            {


                tblUsuario usuario = (from u in conex.tblUsuarios
                                      where u.activo == 1
                                      && u.nombre == nombreUsuario
                                      && u.clave == clave
                                      select u).First();

                return usuario;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public List<tblUsuario> consultarUsuarios(int idPrograma)
        {
            try
            {


                List<tblUsuario> usuario = (from u in conex.tblUsuarios
                                            join li in conex.tblLicencias on u.id equals li.idUsuario
                                            where u.activo == 1
                                            && li.idPrograma == idPrograma
                                            select u).Distinct().ToList();



                return usuario;


            }
            catch (Exception)
            {
                return null;
            }

        }

        public tblUsuario consultarUsuario(string nombreUsuario)
        {
            try
            {


                tblUsuario usuario = (from u in conex.tblUsuarios
                                      where u.activo == 1
                                      && u.nombre == nombreUsuario
                                      select u).First();

                return usuario;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblUsuario consultarUsuario(int id)
        {
            try
            {


                tblUsuario usuario = (from u in conex.tblUsuarios
                                      where u.activo == 1
                                      && u.id == id
                                      select u).First();

                return usuario;


            }
            catch (Exception)
            {
                return null;
            }

        }

        public tblIes consultarIes(string codIesOrNombre)
        {
            try
            {


                tblIes ies = (from u in conex.tblIes
                              where u.activo == 1 && (u.codigoIes == codIesOrNombre || u.nombre == codIesOrNombre)
                              select u).Distinct().First();



                return ies;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblNivelAcademico nivelAcademico(int? id)
        {
            try
            {


                tblNivelAcademico tp = (from u in conex.tblNivelAcademicos
                                      where u.estado == 1 && (u.id == id)
                                      select u).Distinct().First();



                return tp;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblNivelFormacion nivelFormacion(int? id)
        {
            try
            {


                tblNivelFormacion tp = (from u in conex.tblNivelFormacions
                                        where u.estado == 1 && (u.id == id)
                                        select u).Distinct().First();



                return tp;


            }
            catch (Exception)
            {
                return null;
            }

        }

        public tblIes consultarIesNombre(string nombreIes)
        {
            try
            {


                tblIes ies = (from u in conex.tblIes
                              where u.activo == 1 && u.nombre == nombreIes
                              select u).Distinct().First();



                return ies;


            }
            catch (Exception)
            {
                return null;
            }

        }

        public tblCronograma insertarCronograma
            ( int idEnlace,string tipo)
        {
            try
            {


                tblCronograma cronograma = new tblCronograma();
                cronograma.idEnlace = idEnlace;
                cronograma.tipo = tipo;
                cronograma.usuario = "apa";
                cronograma.fecha = DateTime.Now;


                conex.tblCronograma.InsertOnSubmit(cronograma);
                conex.SubmitChanges();

                return cronograma;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblDetalleCronograma insertarDetalleCronograma
           (int idCronograma, int idDetalle, string actividad, DateTime fechaInicioPlan,
            DateTime fechaFinPlan, DateTime fechaInicioReal, DateTime fechaFinReal,
            string peso,
            string indicador,
            string responsable,
            string cargo,
            string meta,
            string descripcion,
            string recursos,
            string otro,
            string usuario)
        {
            try
            {

                tblDetalleCronograma detCronograma = new tblDetalleCronograma();
                detCronograma.idCronograma = idCronograma;
                detCronograma.actividadRequerida = idDetalle;
                detCronograma.actividad = actividad;
                //detCronograma.idDetalle = idDetalle;
                detCronograma.fechaInicioPlan = fechaInicioPlan;
                detCronograma.fechaFinPlan = fechaFinPlan;
                detCronograma.fechaInicioReal = fechaInicioReal;
                detCronograma.fechaFinReal = fechaFinReal;
                detCronograma.peso = peso;
                detCronograma.indicador = indicador;
                detCronograma.responsable = responsable;
                detCronograma.cargo = cargo;
                detCronograma.meta = meta;
                detCronograma.descripcion = descripcion;
                detCronograma.recursos = recursos;
                detCronograma.otro = otro;
                detCronograma.usuario = usuario;
                detCronograma.fecha = DateTime.Now;

                conex.tblDetalleCronogramas.InsertOnSubmit(detCronograma);
                conex.SubmitChanges();

                return detCronograma;


            }
            catch (Exception)
            {
                return null;
            }

        }



    public tblDetalleCronograma insertarDetalleCronogramaInicial
        (int idCronograma, int idDetalle, string actividad)
        {
            try
            {

                tblDetalleCronograma detCronograma = new tblDetalleCronograma();
                detCronograma.idCronograma = idCronograma;
                detCronograma.actividadRequerida = idDetalle;
                detCronograma.actividad = actividad;
                detCronograma.fechaInicioPlan = null;
                detCronograma.fechaFinPlan = null;
                detCronograma.fechaInicioReal = null;
                detCronograma.fechaFinReal = null;
                detCronograma.peso = null;
                detCronograma.indicador = null;
                detCronograma.responsable = null;
                detCronograma.cargo = null;
                detCronograma.meta = null;
                detCronograma.descripcion = null;
                detCronograma.recursos = null;
                detCronograma.otro = null;
                detCronograma.usuario = "apa";
                detCronograma.fecha = DateTime.Now;

                conex.tblDetalleCronogramas.InsertOnSubmit(detCronograma);
                conex.SubmitChanges();

                return detCronograma;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblNombreColumna insertarCronogramaColumnas
            (
              string nombre
           
              )
        {
            try
            {


                tblNombreColumna columnas = new tblNombreColumna();
                columnas.tipoDato = "string";
                columnas.nombre = nombre;
                columnas.activo = 1;
                

                conex.tblNombreColumnas.InsertOnSubmit(columnas);
                conex.SubmitChanges();

                return columnas;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public bool insertarUsuario(string nombreUsuario, string usuarioActual, string clave, string tipo)
        {
            try
            {


                tblUsuario usuario = new tblUsuario();
                usuario.nombre = nombreUsuario;
                usuario.clave = clave;
                usuario.tipo = tipo;
                usuario.activo = 1;
                usuario.usuario = usuarioActual;
                usuario.fecha = DateTime.Now;

                conex.tblUsuarios.InsertOnSubmit(usuario);
                conex.SubmitChanges();

                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }


        public tblUsuario insertarUsuarioRetorno(string nombreUsuario, string usuarioActual, string clave, string tipo)
        {
            try
            {


                tblUsuario usuario = new tblUsuario();
                usuario.nombre = nombreUsuario;
                usuario.clave = clave;
                usuario.tipo = tipo;
                usuario.activo = 1;
                usuario.usuario = usuarioActual;
                usuario.fecha = DateTime.Now;

                conex.tblUsuarios.InsertOnSubmit(usuario);
                conex.SubmitChanges();

                return usuario;


            }
            catch (Exception)
            {
                return null;
            }

        }



        public bool insertarIes(
            string ciudad,
            int idTipo,
            string codies,
            string nombre,
            string contacto,
            string direccion,
            string telefono,
            string correo,
            string usuarioActual)
        {
            try
            {

                tblIes ies = new tblIes();
                ies.ciudad = ciudad;
                ies.codigoIes = codies;
                ies.nombre = nombre;
                ies.direccion = direccion;
                ies.telefono = telefono;
                ies.contacto = contacto;
                ies.correo = correo;
                ies.idTipo = idTipo;
                ies.activo = 1;
                ies.usuario = usuarioActual;
                ies.fecha = DateTime.Now;

                conex.tblIes.InsertOnSubmit(ies);
                conex.SubmitChanges();

                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }



        public bool actualizarIes(
            string ciudad,
            int idTipo,
            string codies,
            string nombre,
            string contacto,
            string direccion,
            string telefono,
            string correo,
            string usuarioActual)
        {

            try
            {

                tblIes ies = conex.tblIes.Single(p => p.codigoIes == codies);
                ies.ciudad = ciudad;
                ies.nombre = nombre;
                ies.contacto = contacto;
                ies.direccion = direccion;
                ies.telefono = telefono;
                ies.correo = correo;
                ies.idTipo = idTipo;
                ies.activo = 1;
                ies.usuario = usuarioActual;
                ies.fecha = DateTime.Now;


                conex.SubmitChanges();

                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }



        public tblPrograma insertarPrograma(int idIes,
                                    string codigo,
                                    string nombre,
                                    int nivelAcademico,
                                    int nivelFormacion,
                                    string contacto,
                                    string telefono,
                                    string direccion,
                                    string correo,
                                    int cantidad,
                                    string usuarioActual)
        {
            try
            {

                tblPrograma programa = new tblPrograma();

                programa.idIES = idIes;
                programa.codigo = codigo;
                programa.nombre = nombre;
                programa.idNivelAcademico = nivelAcademico;
                programa.idNivelFormacion = nivelFormacion;
                programa.cantidadUsuarios = cantidad;
                programa.usuario = usuarioActual;
                programa.fecha = DateTime.Now;
                programa.contacto = contacto;
                programa.telefono = telefono;
                programa.direccion = direccion;
                programa.correo = correo;
                conex.tblProgramas.InsertOnSubmit(programa);
                conex.SubmitChanges();

                return programa;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public bool insertarModulo(string nombre,
                            string usuarioActual)
        {
            try
            {

                tblModulo modulo = new tblModulo();
                modulo.nombre = nombre;

                modulo.activo = 1;
                modulo.usuario = usuarioActual;
                modulo.fecha = DateTime.Now;

                conex.tblModulos.InsertOnSubmit(modulo);
                conex.SubmitChanges();

                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }



        public bool insertarLicencia(int idPrograma, int idModulo, int idUsuario, DateTime fechaIni, DateTime fechaFin, string usuarioActual)
        {
            try
            {

                tblLicencia licencia = new tblLicencia();
                licencia.idPrograma = idPrograma;
                licencia.idModulo = idModulo;
                licencia.idUsuario = idUsuario;
                licencia.fechaVigIni = fechaIni;
                licencia.fechaVigFin = fechaFin;
                licencia.usuario = usuarioActual;
                licencia.fecha = DateTime.Now;

                conex.tblLicencias.InsertOnSubmit(licencia);
                conex.SubmitChanges();




                string consulta = "insert into apa.tblUsuarioxComponente " +
                                    "Select lic.idUsuario,cm.id,1,'" + usuarioActual + "',GETDATE() " +
                                    "FROM apa.tblComponentesxModulo cm inner join apa.tblLicencia lic on " +
                                    "lic.idModulo=cm.idModulo and cm.Activo=1 " +
                                    "Where lic.idUsuario='" + idUsuario + "' and cm.idModulo='" + idModulo + "'";

                int retorno = conex.ExecuteCommand(consulta);


                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }



        public bool insertarLicenciaUsuario(int idPrograma, int idModulo, int idUsuario, DateTime fechaIni, DateTime fechaFin, string usuarioActual)
        {
            try
            {

                tblLicencia licencia = new tblLicencia();
                licencia.idPrograma = idPrograma;
                licencia.idModulo = idModulo;
                licencia.idUsuario = idUsuario;
                licencia.fechaVigIni = fechaIni;
                licencia.fechaVigFin = fechaFin;
                licencia.usuario = usuarioActual;
                licencia.fecha = DateTime.Now;

                conex.tblLicencias.InsertOnSubmit(licencia);
                conex.SubmitChanges();

                string consulta = "insert into apa.tblUsuarioxComponente " +
                                 "Select lic.idUsuario,cm.id,0,'" + usuarioActual + "',GETDATE() " +
                                 "FROM apa.tblComponentesxModulo cm inner join apa.tblLicencia lic on " +
                                 "lic.idModulo=cm.idModulo and cm.Activo=1 " +
                                 "Where lic.idUsuario='" + idUsuario + "' and cm.idModulo='" + idModulo + "'";

                int retorno = conex.ExecuteCommand(consulta);

                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }

        public tblResolucion insertarAutoevaluacion(
            int idPrograma,
            string nivelAcademico,
            string numeroCreditos,
            string metodologia,
            DateTime fechaCreacion,
            string resolucionAprobacionRC,
            DateTime fechaResolucionRC,
            int vigenciaRC,
            DateTime fechaVencimientoRC,
            DateTime fechaRadicacionSaces,
            int NoAutoEvaluacion,
            int estadoRC,
            string resolucionAprobacionAC,
            DateTime fechaResolucionAC,
            int vigenciaAC,
            DateTime fechaVencimientoAC,
            int estadoAC,
            DateTime fechaDesde,
            DateTime fechaHasta
            )
        {
            try
            {
                tblResolucion autoEv = new tblResolucion();
                autoEv.idPrograma = idPrograma;
                autoEv.nivelAcademico = nivelAcademico;
                autoEv.numeroCreditos = numeroCreditos;
                autoEv.metodologia = metodologia;
                autoEv.fechaCreacion = fechaCreacion;


                autoEv.resolucionAprobacionRC = resolucionAprobacionRC;
                autoEv.fechaResolucionRC = fechaResolucionRC;
                autoEv.vigenciaRC = vigenciaRC;
                autoEv.fechaVencimientoRC = fechaVencimientoRC;
                autoEv.fechaRadicacionSaces = fechaRadicacionSaces;
                autoEv.NoAutoEvaluacion = NoAutoEvaluacion;
                autoEv.estadoRC = estadoRC;

                autoEv.resolucionAprobacionAC = resolucionAprobacionAC;
                autoEv.fechaResolucionAC = fechaResolucionAC;
                autoEv.vigenciaAC = vigenciaAC;
                autoEv.fechaVencimientoAC = fechaVencimientoAC;
                autoEv.fechaActual = DateTime.Now;
                autoEv.estadoAC = estadoAC;

                autoEv.fechaDesdeAutoEvaluacion = fechaDesde;
                autoEv.fechaHastaAutoEvaluacion = fechaHasta;

                conex.tblResolucion.InsertOnSubmit(autoEv);
                conex.SubmitChanges();

                return autoEv;


            }
            catch (Exception)
            {
                return null;
            }

        }



        public bool actualizarLicencia(int idPrograma, int idmodulo, DateTime fechaIni, DateTime fechaFin, string usuarioActual)
        {
            try
            {

                List<tblLicencia> licencias = conex.tblLicencias.ToList().Where(p => p.idPrograma == idPrograma && p.idModulo == idmodulo).ToList();
                DateTime fecha = DateTime.Now;

                if (licencias.Count == 0)
                {

                    return false;
                }


                foreach (tblLicencia licencia in licencias)
                {

                    licencia.fechaVigIni = fechaIni;
                    licencia.fechaVigFin = fechaFin;
                    licencia.usuario = usuarioActual;
                    licencia.fecha = fecha;
                }
                conex.SubmitChanges();

                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }


        public bool actualizarUsuarioComponente(int idUsuario, int idComponente, int estado, DateTime fecha)
        {

            try
            {

                tblUsuarioxComponente usuarioxcomponente = conex.tblUsuarioxComponentes.Single(p => p.idUsuario == idUsuario && p.idCompxModulo == idComponente);
                usuarioxcomponente.activo = estado;
                usuarioxcomponente.fecha = fecha;
                conex.SubmitChanges();

                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }

        public tblDetalleCronograma actualizarDetalleCronograma
          (int idDetalle, string actividad, DateTime fechaInicioPlan,
           DateTime fechaFinPlan, DateTime fechaInicioReal, DateTime fechaFinReal,
           string peso,
           string indicador,
           string responsable,
           string cargo,
           string meta,
           string descripcion,
           string recursos,
           string otro,
           string usuario)
        {
            try
            {


                tblDetalleCronograma detCronograma = conex.tblDetalleCronogramas.Single(p => p.idDetalle == idDetalle);

              
                detCronograma.actividad = actividad;
                //detCronograma.idDetalle = idDetalle;
                detCronograma.fechaInicioPlan = fechaInicioPlan;
                detCronograma.fechaFinPlan = fechaFinPlan;
                detCronograma.fechaInicioReal = fechaInicioReal;
                detCronograma.fechaFinReal = fechaFinReal;
                detCronograma.peso = peso;
                detCronograma.indicador = indicador;
                detCronograma.responsable = responsable;
                detCronograma.cargo = cargo;
                detCronograma.meta = meta;
                detCronograma.descripcion = descripcion;
                detCronograma.recursos = recursos;
                detCronograma.otro = otro;
                detCronograma.usuario = usuario;
                detCronograma.fecha = DateTime.Now;


                conex.SubmitChanges();

                return detCronograma;


            }
            catch (Exception)
            {
                return null;
            }

        }






        public List<tblLicencia> consultarLicencia(int idPrograma, int idmodulo)
        {
            try
            {

                List<tblLicencia> licencias = conex.tblLicencias.ToList().Where(p => p.idPrograma == idPrograma && p.idModulo == idmodulo).ToList();




                return licencias;


            }
            catch (Exception)
            {

            }
            return null;
        }


        public bool actualizarUsuario(int idUsuario, string nombre)
        {

            try
            {

                tblUsuario usuario = conex.tblUsuarios.Single(p => p.id == idUsuario);
                usuario.nombre = nombre;
                usuario.fecha = DateTime.Now;
                conex.SubmitChanges();

                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }


        public bool actualizarPrograma(
                                   int id,
                                   string codigo,
                                   string nombre,
                                   int nivelFormacion,
                                   int nivelAcademico,
                                   string contacto,
                                   string telefono,
                                   string direccion,
                                   string correo,
                                   int cantidad,
                                   string usuarioActual)
        {
            try
            {

                tblPrograma programa = conex.tblProgramas.Single(p => p.id == id);

                programa.codigo = codigo;
                programa.nombre = nombre;
                programa.idNivelFormacion = nivelFormacion;
                programa.idNivelAcademico = nivelAcademico;
                programa.contacto = contacto;
                programa.telefono = telefono;
                programa.direccion = direccion;
                programa.correo = correo;
                programa.cantidadUsuarios = cantidad;
                programa.usuario = usuarioActual;
                programa.fecha = DateTime.Now;

                conex.SubmitChanges();



                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }

        public bool actualizarPrograma(
                                  int id,
                                  string facultad,
                                  string sede,
                                  string esado,
                                //  int nivelAcademico,
                                  string nroCredito,
                                  string metodologia,
                                  DateTime fechaFundacion
                                  )
        {
            try
            {

                tblPrograma programa = conex.tblProgramas.Single(p => p.id == id);

                programa.facultad = facultad;
                programa.sede = sede;
                programa.estado = esado;
                //programa.nivelAcademico = nivelAcademico;
                programa.nroCredito = nroCredito;
                programa.metodologia = metodologia;
                programa.fechaFundacion = fechaFundacion;
            

                conex.SubmitChanges();



                return true;


            }
            catch (Exception)
            {
                return false;
            }

        }

        public bool eliminarUsuario(int idUsuario)
        {

            try
            {


                string consulta =
                              "delete " +
                              "FROM apa.tblLicencia " +
                              "Where idUsuario='" + idUsuario + "' ";

                int retorno = conex.ExecuteCommand(consulta);

                //tblUsuarioxComponente usuarioxComp = conex.tblUsuarioxComponentes.Single(p => p.idUsuario == idUsuario);
                //conex.tblUsuarioxComponentes.DeleteOnSubmit(usuarioxComp);

                consulta =
                             "delete " +
                             "FROM apa.tblUsuarioxComponente " +
                             "Where idUsuario='" + idUsuario + "' ";

                retorno = conex.ExecuteCommand(consulta);



                tblUsuario usuario = conex.tblUsuarios.Single(p => p.id == idUsuario);
                conex.tblUsuarios.DeleteOnSubmit(usuario);

                conex.SubmitChanges();

                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }

        public bool eliminarUsuarioLicencia(int idPrograma, int idUsuario, int idModulo)
        {

            try
            {


                string consulta =
                              "delete " +
                              "FROM apa.tblLicencia " +
                              "Where idUsuario='" + idUsuario + "' AND idModulo='" + idModulo + "'";

                int retorno = conex.ExecuteCommand(consulta);

                //tblUsuarioxComponente usuarioxComp = conex.tblUsuarioxComponentes.Single(p => p.idUsuario == idUsuario);
                //conex.tblUsuarioxComponentes.DeleteOnSubmit(usuarioxComp);


                List<tblLicencia> licencia = consultarLicenciaXPrograma(idPrograma);

                if (licencia != null)
                {
                    if (licencia.Count <= 1)
                    {
                        consulta =
                                     "delete " +
                                     "FROM apa.tblUsuarioxComponente " +
                                     "Where idUsuario='" + idUsuario + "' ";

                        retorno = conex.ExecuteCommand(consulta);



                        tblUsuario usuario = conex.tblUsuarios.Single(p => p.id == idUsuario);
                        conex.tblUsuarios.DeleteOnSubmit(usuario);

                        conex.SubmitChanges();
                    }
                }
                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }

        public bool eliminarPrograma(int idPrograma)
        {

            try
            {


                string consulta =
                              "delete " +
                              "FROM apa.tblPrograma " +
                              "Where id='" + idPrograma + "' ";

                int retorno = conex.ExecuteCommand(consulta);

                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }

        public bool eliminarCronogramaActividad(string idPrograma, string nombreActividad)
        {

            try
            {


                string consulta =
                              "delete " +
                              "FROM apa.tblCronograma " +
                              "Where c20='" + idPrograma + "' AND c1='" + nombreActividad + "'";

                int retorno = conex.ExecuteCommand(consulta);

             
                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }

        public bool eliminarCronogramaColumna(string nombreColumna)
        {

            try
            {


                string consulta =
                              "delete " +
                              "FROM apa.tblNombreColumnas " +
                              "Where nombre='" + nombreColumna + "'";

                int retorno = conex.ExecuteCommand(consulta);


                return true;
            }
            catch (Exception)
            {

            }

            return false;
        }


        public List<tblIes> ies()
        {
            try
            {


                List<tblIes> ies = (from u in conex.tblIes
                                    where u.activo == 1
                                    select u).OrderBy(x => x.nombre).ToList();

                return ies;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public List<tblNivelAcademico> nivelAcademico()
        {
            try
            {


                List<tblNivelAcademico> tipoPrograma = (from u in conex.tblNivelAcademicos
                                                      where u.estado == 1
                                                      select u).ToList();

                return tipoPrograma;


            }
            catch (Exception)
            {
                return null;
            }


        }


        public List<tblNivelFormacion> nivelFormacion()
        {
            try
            {


                List<tblNivelFormacion> tipoPrograma = (from u in conex.tblNivelFormacions
                                                        where u.estado == 1
                                                        select u).ToList();

                return tipoPrograma;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public List<tblTipoIES> tipoIes()
        {
            try
            {


                List<tblTipoIES> tpIes = (from u in conex.tblTipoIES
                                          where u.activo == 1
                                          select u).OrderBy(x => x.nombre).ToList();

                return tpIes;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public dynamic consultarInfo()
        {

            try
            {


                var info = (from usu in conex.tblUsuarios
                            join li in conex.tblLicencias on usu.id equals li.idUsuario into licencia
                            from li in licencia.DefaultIfEmpty()
                            join prog in conex.tblProgramas on li.idPrograma equals prog.id into programa
                            from prog in programa.DefaultIfEmpty()
                            join iesU in conex.tblIes on prog.idIES equals iesU.id into instituto
                            from iesU in instituto.DefaultIfEmpty()
                            join tipo in conex.tblTipoIES on iesU.idTipo equals tipo.id into tipo1
                            from tipo in tipo1.DefaultIfEmpty()
                            join modulo in conex.tblModulos on li.idModulo equals modulo.id
                            where usu.activo == 1 && usu.tipo.ToUpper() == "ADMINPROGRAMA"
                            select new
                            {
                                COD_IES = iesU.codigoIes,
                                INSTITUTO = iesU.nombre.ToUpper(),
                                TIPO_INSTITUTO = tipo.nombre.ToUpper(),
                                CIUDAD = iesU.ciudad.ToUpper(),
                                COD_SNIES = prog.codigo.ToUpper(),
                                NOM_PROGRAMA = prog.nombre.ToUpper(),
                                USUARIO = usu.nombre.ToUpper(),
                                TIPO_LICENCIA = modulo.nombre.ToUpper(),
                                //TIPO_USUARIO=usu.tipo.ToUpper(),
                                FECHA_INICIO = String.Format("{0:MM/dd/yyyy}", li.fechaVigIni),//.ToString("dd/MM/yyyy"),
                                FECHA_FIN = String.Format("{0:MM/dd/yyyy}", li.fechaVigFin) //.ToString("dd/MM/yyyy")

                            }).Distinct().OrderBy(x => x.COD_IES).OrderBy(x => x.COD_SNIES).ToList();


                //var info = (from iesU in conex.tblIes
                //            join prog in conex.tblProgramas on iesU.id equals prog.idIES into programa
                //            from prog in programa.DefaultIfEmpty()
                //            join li in conex.tblLicencias on prog.id equals li.idPrograma into licencia
                //            from li in licencia.DefaultIfEmpty()
                //            join usu in conex.tblUsuarios on li.idUsuario equals usu.id into usuario
                //            from usu in usuario.DefaultIfEmpty()
                //            join tipo in conex.tblTipoIES on iesU.idTipo equals tipo.id into tipo10
                //            from tipo in tipo10.DefaultIfEmpty()
                //            join modulo in conex.tblModulos on li.idModulo equals modulo.id
                //            where usu.activo == 1 && usu.tipo.ToUpper() == "ADMINPROGRAMA"
                //           select new
                //           {


                //           }).ToList();


                return info;


            }
            catch (Exception)
            {
                return null;
            }


        }


        public List<tblDetalleCronograma> consultarCronograma(int idCronograma)
        {

            try
            {
                List<tblDetalleCronograma> cronograma = (from u in conex.tblDetalleCronogramas
                                                         where u.idCronograma == idCronograma
                                                  select u).ToList();
                return cronograma;
            }
            catch (Exception)
            {

                return null;
            }
        }

        public tblCronograma consultarCronograma(int idEnlace, string tipo)
        {

            try
            {
                tblCronograma cronograma = (from u in conex.tblCronograma
                                                         where u.idEnlace==idEnlace
                                                         && u.tipo==tipo
                                                         select u).First();
                return cronograma;
            }
            catch (Exception)
            {

                return null;
            }
        }

        public List<tblNombreColumna> consultarNombreColumnasCronograma()
        {

            try
            {
                List<tblNombreColumna> nombres = (from u in conex.tblNombreColumnas
                                                  select u).ToList();
                return nombres;
            }
            catch (Exception)
            {

                return null;
            }
        }


        public tblPrograma consultarPrograma(int idPrograma)
        {

            try
            {


                tblPrograma programa = (from u in conex.tblProgramas
                                        where u.id == idPrograma
                                        select u).First();

                return programa;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public tblPrograma consultarProgramaXCodigo(int idIes, string codigo)
        {

            try
            {


                tblPrograma programa = (from u in conex.tblProgramas
                                        where u.idIES == idIes && u.codigo == codigo
                                        select u).First();

                return programa;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public tblPrograma consultarProgramaXNombre(int idIes, string nombre)
        {

            try
            {


                tblPrograma programa = (from u in conex.tblProgramas
                                        where u.idIES == idIes && u.nombre == nombre
                                        select u).First();

                return programa;


            }
            catch (Exception)
            {
                return null;
            }


        }



        public tblModulo consultarModulo(string nombre)
        {

            try
            {


                tblModulo modulo = (from u in conex.tblModulos
                                    where u.nombre == nombre && u.activo == 1
                                    select u).First();

                return modulo;


            }
            catch (Exception)
            {
                return null;
            }


        }


        public tblAutoEvaluacion consultarAutoevaluacionXResolucion(int idResolucion)
        {

            try
            {


                tblAutoEvaluacion autoe = (from u in conex.tblAutoEvaluacion
                                    where u.vigente == 1 
                                          && u.idResolucion == idResolucion
                                    select u).First();

                return autoe;


            }
            catch (Exception)
            {
                return null;
            }


        }



        public List <tblDetalleCronograma> consultarDetalleCronograma(int idCronograma)
        {

            try
            {


                List <tblDetalleCronograma> cron = (from u in conex.tblDetalleCronogramas
                                             where u.idCronograma == idCronograma
                                             select u).ToList();
                return cron;


            }
            catch (Exception)
            {
                return null;
            }


        }


        public tblDetalleCronograma consultarDetalleCronogramaIndiv(int idDetalle)
        {

            try
            {


                tblDetalleCronograma det = (from u in conex.tblDetalleCronogramas
                                                   where u.idDetalle == idDetalle
                                                   select u).First();
                return det;


            }
            catch (Exception)
            {
                return null;
            }


        }



        public List<tblComponentesxModulo> consultarModulos(string nombre, int idUsuario)
        {

            try
            {



                string query = "select cm.* " +
                               "from  apa.tblComponentesxModulo cm inner join apa.tblLicencia lic on " +
                               "lic.idModulo=cm.idModulo " +
                               "and cm.Activo=1 inner join apa.tblModulos modulo on modulo.id=cm.idModulo " +
                               "and getdate() between fechaVigIni and fechaVigFin " +
                               "where modulo.nombre='" + nombre + "' and lic.idUsuario='" + idUsuario + "'";
                List<tblComponentesxModulo> cxmodulos = conex.ExecuteQuery<tblComponentesxModulo>(query).ToList();

                return cxmodulos;


            }
            catch (Exception)
            {
                return null;
            }


        }


        public List<tblResolucion> consultarResolucion(int idPrograma)
        {

            try
            {


                string query = "  select au1.* " +
                               "from apa.tblResolucion au1 inner join ( " +
                               "select  max(consecutivo) as consecutivo " +
                               ",idPrograma,estadoRC,max(fechaActual) as fechaActual,estadoAC " +
                               "from apa.tblResolucion " +
                               "where idPrograma=" + idPrograma + " and (estadoRC=1 OR estadoAC=1) group by  idPrograma,estadoRC ,estadoAC) au2 on au1.consecutivo=au2.consecutivo ";

                List<tblResolucion> resolucion = conex.ExecuteQuery<tblResolucion>(query).ToList();

                return resolucion;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public List<tblConsideraciones> consultarConsideraciones()
        {

            try
            {


                List<tblConsideraciones> consideraciones = (from u in conex.tblConsideraciones
                                                            where u.activo == 1
                                                            select u).ToList();


                return consideraciones;


            }
            catch (Exception)
            {
                return null;
            }


        }

        public List<tblComponentesxModulo> consultarModulosxComponentesXUsuario(string nombre, int idUsuario)
        {

            try
            {



                string query = "select cm.id,cm.idModulo,cm.nombre,case when  usermod.activo is null then 0 else 1 end as activo,cm.usuario,cm.fexha " +
                            "from  apa.tblComponentesxModulo cm inner join apa.tblLicencia lic on " +
                            "lic.idModulo=cm.idModulo " +
                            "and getdate() between lic.fechaVigIni and lic.fechaVigFin " +
                            "and cm.Activo=1 inner join apa.tblModulos modulo on modulo.id=cm.idModulo left join apa.tblUsuarioxComponente usermod on cm.id=usermod.idCompxModulo and usermod.activo=1 " +
                            "and usermod.idUsuario='" + idUsuario + "' " +
                            "where modulo.nombre='" + nombre + "' and lic.idUsuario='" + idUsuario + "'";
                List<tblComponentesxModulo> cxmodulos = conex.ExecuteQuery<tblComponentesxModulo>(query).ToList();

                return cxmodulos;


            }
            catch (Exception)
            {
                return null;
            }


        }





        public List<tblLicencia> consultarLicenciaXUsuario(int idUser)
        {
            try
            {


                List<tblLicencia> licencia = (from u in conex.tblLicencias
                                              where u.idUsuario == idUser
                                              select u).ToList();

                return licencia;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public List<tblLicencia> consultarLicenciaXPrograma(int idPrograma)
        {
            try
            {


                List<tblLicencia> licencia = (from u in conex.tblLicencias
                                              where u.idPrograma == idPrograma
                                              select u).ToList();

                return licencia;


            }
            catch (Exception)
            {
                return null;
            }

        }

        public List<tblDetalleCronogramaVisibilidad> consultarVisibilidad(int? idDetalle)
        {
            try
            {


                List<tblDetalleCronogramaVisibilidad> detalle = (from u in conex.tblDetalleCronogramaVisibilidad
                                              where u.idDetalle == idDetalle || idDetalle==null
                                              select u).ToList();

                return detalle;


            }
            catch (Exception)
            {
                return null;
            }
            
        }

        public tblDetalleCronogramaVisibilidad insertarDetalleCronogramaVisibilidad (int idCronograma, int idColumna, int visible)
        {
            try
            {

                tblDetalleCronogramaVisibilidad detCronograma = new tblDetalleCronogramaVisibilidad();
                detCronograma.idDetalle = idCronograma;
                detCronograma.idColumna = idColumna;
                detCronograma.visible = visible;
                detCronograma.usuario = "apa";
                detCronograma.fecha = DateTime.Now;

                conex.tblDetalleCronogramaVisibilidad.InsertOnSubmit(detCronograma);
                conex.SubmitChanges();

                return detCronograma;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblDetalleCronogramaVisibilidad actualizarDetalleCronogramaVisibilidad(int idCronograma, int idColumna, int visible)
        {
            try
            {

                tblDetalleCronogramaVisibilidad detCronograma = conex.tblDetalleCronogramaVisibilidad.Single(p => p.idDetalle == idCronograma && p.idColumna == idColumna);
                detCronograma.idDetalle = idCronograma;
                detCronograma.idColumna = idColumna;
                detCronograma.visible = visible;
                detCronograma.usuario = "apa";
                detCronograma.fecha = DateTime.Now;

                conex.SubmitChanges();

                return detCronograma;


            }
            catch (Exception)
            {
                return null;
            }

        }


        public tblResolucion actualizarResolucion(int idResolucion)
        {

            try
            {



                tblResolucion resol = conex.tblResolucion.Single(x => x.consecutivo == idResolucion);
                resol.estadoAC = 0;
                resol.estadoRC = 0;


                conex.SubmitChanges();

                return resol;

            }
            catch (Exception)
            {
                return null;
            }


        }


        public tblResolucion actualizarResolucion(
           int idResolucion,
           int idPrograma,
           string nivelAcademico,
           string numeroCreditos,
           string metodologia,
           DateTime fechaCreacion,
           string resolucionAprobacionRC,
           DateTime fechaResolucionRC,
           int vigenciaRC,
           DateTime fechaVencimientoRC,
           DateTime fechaRadicacionSaces,
           int NoAutoEvaluacion,
           int estadoRC,
           string resolucionAprobacionAC,
           DateTime fechaResolucionAC,
           int vigenciaAC,
           DateTime fechaVencimientoAC,
           int estadoAC,
           DateTime fechaDesde,
           DateTime fechaHasta
           )
        {
            try
            {
                tblResolucion resolucion = conex.tblResolucion.Single(x => x.consecutivo == idResolucion);

                resolucion.idPrograma = idPrograma;
                resolucion.nivelAcademico = nivelAcademico;
                resolucion.numeroCreditos = numeroCreditos;
                resolucion.metodologia = metodologia;
                resolucion.fechaCreacion = fechaCreacion;


                resolucion.resolucionAprobacionRC = resolucionAprobacionRC;
                resolucion.fechaResolucionRC = fechaResolucionRC;
                resolucion.vigenciaRC = vigenciaRC;
                resolucion.fechaVencimientoRC = fechaVencimientoRC;
                resolucion.fechaRadicacionSaces = fechaRadicacionSaces;
                resolucion.NoAutoEvaluacion = NoAutoEvaluacion;
                resolucion.estadoRC = estadoRC;

                resolucion.resolucionAprobacionAC = resolucionAprobacionAC;
                resolucion.fechaResolucionAC = fechaResolucionAC;
                resolucion.vigenciaAC = vigenciaAC;
                resolucion.fechaVencimientoAC = fechaVencimientoAC;
                resolucion.fechaActual = DateTime.Now;
                resolucion.estadoAC = estadoAC;

                resolucion.fechaDesdeAutoEvaluacion = fechaDesde;
                resolucion.fechaHastaAutoEvaluacion = fechaHasta;

                conex.SubmitChanges();

                return resolucion;


            }
            catch (Exception)
            {
                return null;
            }

        }

        public tblAutoEvaluacion actualizarAutoevaluacionEstadoNoVigente(int idResolucion)
        {

            try
            {


                tblAutoEvaluacion autoe = conex.tblAutoEvaluacion.Single(p => p.idResolucion == idResolucion && p.vigente == 1);
                autoe.vigente = 0;


                conex.SubmitChanges();

                return autoe;


            }
            catch (Exception)
            {
                return null;
            }


        }


        public tblAutoEvaluacion insertarAutoevaluacionTabla(
         int idResolucion,
         int numero,
         DateTime fechaDesde,
         DateTime fechaHasta
         )
        {
            try
            {
                tblAutoEvaluacion autoEv = new tblAutoEvaluacion();
                autoEv.idResolucion = idResolucion;
                autoEv.numero = numero;
                autoEv.fechaDesde = fechaDesde;
                autoEv.fechaHasta = fechaHasta;
                autoEv.vigente = 1;
                autoEv.usuario = "apa";
                autoEv.fecha = DateTime.Now;

                conex.tblAutoEvaluacion.InsertOnSubmit(autoEv);
                conex.SubmitChanges();

                return autoEv;


            }
            catch (Exception)
            {
                return null;
            }

        }


    }
}